オセロAI"Egaroucid"におけるAlphaZero風アイデア
【基本的な情報】
Egaroucidはにゃにゃんが作っているオセロAIである。2021年6月に一瞬だけ世界10位になった。
【関連URL】
【概要】
AlphaZeroは様々なゲームにおいてとんでもない強さを持つゲームAIである。
深層学習、強化学習、そして探索をうまく組み合わせることで自己対戦によって強くなった。
MCTSの成功率項の計算に、終局結果に加えてそのノードをNNで評価した結果(Value)を使う。
MCTSのバイアス項の計算に、NNで推論した方策(Policy)の確率分布を使う。
以上の特徴を持ったMCTSを使っている。NNはPolicyとValueの両方を返すDual Networkである。
【変更履歴】
2021/09/20 14:11
NNが必ずしも合法手だけを返すわけないよなーって思ってたら、実際にそうで、合法手でマスクしているようだった。そしていい感じに全ての確率の和が1.0になるように変換して返していた。valueについては気合で頑張ってくれ。
2021/09/20 14:11
NNが返すValueに関して、これまでの工夫である、既存評価関数に使っていた様々な値を前計算してNNへの入力として与えるのをやろうと思う。
ところで、何手目かで着手可能数の平均は変わるはずなので、それを入力に組み込むか今何手目かを入力に組み込むかしたほうが精度上がりそう。前者は統計資料があるけど実際完全インデックス化で取り入れられる値はそれより若干大きくなるからなと思ったが別にそんなのどうでも良い気がしてきたな。勝手に重みを学習してくれれば良いので。
2021/09/20 14:16
入力を実際に考える。
8x8盤面を白黒で合わせて2つ、およびその盤面で打つ手番をplayerとして、追加の既存の評価関数に使われていた9要素、およびN手目における平均着手可能数の統計データも入れる。さらについでなので何手目かの情報も入れる。合計で139入力。
こうすると畳み込み周りがだるいことになるが、そもそも推論パートを直書きするんだから全部前処理だと思えば良い気がする。
2021/09/20 19:44
とりあえず推論パート以外の自己対戦を実装完了。
2021/09/20 21:59
本のコードを読んだら学習の最初の方はランダム対戦の結果を使って自己学習していてものすごく効率が悪そうなので、今回は12万局の棋譜を利用して初期だけは特に棋譜で学習してみることにする。
2021/09/20 23:02
盤面回転は過学習のリスクが常にあるので、前処理として盤面回転を行うようにして内部では必ず1手目をd3に打つようにすることにした。未来の自分がうまく実装してくれるはず。
欲を言えば先手と後手でモデルを分けたほうが良いかもしれないとは思いつつそれは同一モデルを使うことにした。
2021/09/20 23:46
とりあえず一度小さめモデルで学習してみた。一応lossは下がっていることを確認。10対戦のデータを使用。
value lossが下がる気配ないが…
https://scrapbox.io/files/61489ec7b49441002332173b.png
2021/09/20 23:52
value_lossが下がらないのはactivationをtanhにしているから説を提唱して、activationを全部LeakyReLUにしてみた。10対戦のデータを使用。
https://scrapbox.io/files/6148a03a92e31c001d3b5d64.png
いい感じ。valueの単位は「石」なので、負の値を取る可能性がある。ということで最後の層でactivationをなくしてみよう。
2021/09/20 23:55
value出力層の最後のDenseの後のactivationをなくした。10対戦のデータを使用。
https://scrapbox.io/files/6148a115b035cb001d15eec5.png
見事にvalue_lossが下がって大笑いしている。
2021/09/21 0:01
100対戦で10エポックだけ学習。
https://scrapbox.io/files/6148a250906bf0001de7c0a3.png
縦軸が狂っているが、少なくともvalue_lossは下がっていそう。policy_lossは知らん。
2021/09/21 0:12
グラフ表示を変更。Dual Networkなのでそれぞれのグラフを別に出力。
そして単位がわかりにくいので全てmaeにした。
縦軸のラベルがlossなのはご愛嬌。
100対戦10エポックで学習。
単位は
policy: categorical_crossentropy
value: 最終石差
https://scrapbox.io/files/6148a51b4d43f2001dc9d9d2.png
https://scrapbox.io/files/6148a5337a04f6001da4635a.png
2021/09/21 0:36
valueが見にくいので-64から64だったのを64で割って-1から1までの値にした。
100対戦100エポックで学習
https://scrapbox.io/files/6148ad46e38f62001e2b532b.png
https://scrapbox.io/files/6148ad59521efd001d6c8bba.png
valueのmaeは大体誤差が1石くらいであることを示しているので相当良いのでは?
なおvalidationに使うデータはtrainのものとは違う対戦の結果を使っているのでチートはしていないはず。
良くね?え、良くね??????
2021/09/21 0:59
100対戦でこんなに精度が出て良いのか不安なので1000対戦のデータで学習。
学習データは47000盤面くらい。
activationをtanhにした。
https://scrapbox.io/files/6148be4b2e8774001d1ee05b.png
https://scrapbox.io/files/6148be5f71023f0023d839fe.png
やたら良いな…
2021/09/21 2:03
畳み込みを使った残差ブロックを2つ重ねていたがこれを1つにして簡略化。
目的関数をmseからlogcoshに変更。
1000局47000盤面くらいで学習。
https://scrapbox.io/files/6148c1365d81cb00235cdc57.png
https://scrapbox.io/files/6148c1464e1692002317e424.png
2021/09/21 2:14
畳み込みのカーネル数を128から64に減らした。
11個の独自評価値のNNを64個の全結合を2層だったが32個の全結合を2層に変更。
1000局47000盤面を使用。
https://scrapbox.io/files/6148c2dd0cfa3c0024f9044c.png
https://scrapbox.io/files/6148c2eeb49441002332b161.png
全く問題なさそう。
2021/09/21 2:21
畳み込みの残差を更に簡略化。
独自評価値のNNは32個の全結合1つに簡略化。
https://scrapbox.io/files/6148c467d824d9001dc92cfb.png
https://scrapbox.io/files/6148c47fdbe713001db58b1b.png
問題なし。
2021/09/21 2:41
同じ条件で学習、テストに実際のデータを使ってみる。
https://scrapbox.io/files/6148c7ebdb9770001d0f9c10.png
https://scrapbox.io/files/6148c7fa521efd001d6cf8e1.png
policyは4/10が棋譜と同じものであった。まあそれなりに精度良いんじゃない?これは合法手でマスクしたものではないし。
2021/09/21 2:49
1万局、47万盤面で学習。時間がかかるので10エポックだけ。
https://scrapbox.io/files/6148d08fed7b32001de8e5f5.png
https://scrapbox.io/files/6148d09fbdca67001d9bb856.png
valueはもともと小さいので誤差だな…
正直体感そんなに性能は良くなかった。多分エポックを勧めすぎて過学習気味になったんだと思う。モデル小さいし。
実際の推論ではpolicyは1/10しか正解しなかったしvalueも結構ばらけていた。
2021/09/21 3:20
上と同じ条件で2エポックだけ学習。
https://scrapbox.io/files/6148f84131295b0023a58535.png
https://scrapbox.io/files/6148f85a2e4b4e001d11d2c6.png
まあいいんじゃない?
code:python
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, [0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0], 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -0.26115690792167473, 0.9024737306893134, 0.805473983320689, 0.30394458178393285, -0.9763264186951526, -0.7708982511976294, -0.4223631774173048, -0.43917408118002876, 1.730048449055066, 0.40558344178204375, 0.37572779686923646 ans_policy (38, 1.0)
prd_policy (2, 0.25671184)
ans_value 0.431
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -1.3793433089484668, -1.139035176383491, -0.9875423354796025, -0.07765683081156205, 0.9822634549344371, 0.9704035623028557, -0.4223631774173048, -0.43917408118002876, -0.1673508961011004, -1.3290012524140742, -1.3568805599727354 ans_policy (29, 1.0)
prd_policy (29, 0.4438385)
ans_value 0.001
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -0.8202501084350707, 0.18794561321383182, -0.5890942646350932, 0.46571039799289254, 0.8515091935516551, 0.1372296995676893, -0.4223631774173048, -0.43917408118002876, 1.6035551593779882, -0.5856078120443093, -0.31731554586755223 ans_policy (24, 1.0)
prd_policy (22, 0.5556571)
ans_value 0.079
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0], 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param 0.29793629259172133, -0.11828072284708882, -0.19064619379058403, 1.0878866141812, 0.1977378866377447, -0.12708208453863717, -0.4223631774173048, -0.43917408118002876, -0.29384418577817817, 2.1401681359781617, 0.08695973739557451 ans_policy (41, 1.0)
prd_policy (9, 0.10816841)
ans_value -0.016
board 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -0.26115690792167473, 0.9024737306893134, 0.20780187705392517, 0.30394458178393285, -0.6285564040451141, -0.08999953572371988, -0.4223631774173048, -0.43917408118002876, 2.741994766471688, -0.5856078120443093, 0.37572779686923646 ans_policy (46, 1.0)
prd_policy (46, 0.18490091)
ans_value 0.024
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param 1.3043040535158341, 1.3107755121038742, -0.9875423354796025, -1.463035872190859, -1.5402041709084004, -0.43242136946146814, 3.025254466860347, 1.075567912746018, -1.938256951580189, 1.6445725090649852, 1.4152928109744196 ans_policy (14, 1.0)
prd_policy (14, 0.4689743)
ans_value 0.079
board 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -0.5966128282297124, -0.9348842856762106, 0.008577841631670574, 1.3243135763327567, 0.5464159169918302, 0.894660483872386, -0.4223631774173048, -0.43917408118002876, 0.2121289729301329, 0.40558344178204375, -0.8370980529201437 ans_policy (12, 1.0)
prd_policy (51, 0.35292307)
ans_value -0.016
board 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0], 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 param 1.3043040535158341, 1.2087000667502341, -1.5852144417463663, -1.276383007334367, -0.06195460471972539, -1.4604758610750301, 1.5477040478842106, 0.6427844859100047, -1.432283792871878, 0.15778562832545548, 1.3575391990796872 ans_policy (7, 1.0)
prd_policy (55, 0.4264765)
ans_value -0.001
board 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 param -0.8202501084350707, -1.3431860670907714, -0.5890942646350932, 0.9095294322072187, 0.8515091935516551, 1.0082751015180904, -0.4223631774173048, -0.43917408118002876, -0.6733240548094115, 0.15778562832545548, -1.183619724288538 ans_policy (44, 1.0)
prd_policy (5, 0.3124579)
ans_value -0.004
board 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0 param 0.8570294931051173, 0.5962473946283927, -0.5890942646350932, -0.0029956848689653283, 0.5482319483999244, -1.2655952321966344, 1.5477040478842106, -0.43917408118002876, -1.6852703722260336, 1.7684714157932793, 0.7800030801323632 ans_policy (10, 1.0)
prd_policy (58, 0.3497619)
ans_value -0.001
2021/09/21 23:48
推論が遅いのでconvのkernelを16枚に、追加インプットの1つ目のdenseのノード数を8つにした。それぞれ元の半分になっている。
これは微妙そうだった。
2021/09/21 23:51
kernelとdenseを戻してkernel_sizeを3から4にした。
性能が結構良さそう。元より良くなったかもしれん。
val_policy_mae: 0.0255 - val_value_mae: 0.0138
2021/09/22 0:16
実は推論パート間違ってる説が出てきたので調査。
パラメータの一部が指数表記で出力されていてそれをうまく読み込めなかったことによる誤差っぽかった。
2021/09/22 1:00
policy networkの方のlossがクロスエントロピーなのだが、これが結構下がらないことに気づいた。policyの出力前に全結合128ノードを一つ追加してみた。
1000局で学習。
https://scrapbox.io/files/614a01d93dea6700238fd9e2.png
https://scrapbox.io/files/614a01e8a84c17001dd5efe1.png
うーん、、、
2021/09/22 1:02
このままカーネルサイズを3に、枚数を32枚に戻す。policyなので盤面のデータが一層重要そうなので。
https://scrapbox.io/files/614a028453fdd5001d176eb4.png
だめ
2021/09/22 1:05
残差を復活させることにした。
残差1つ、本のデフォルト設定にconvを独自設定にしたやつを追加。
1万局で学習
10エポックでval_policy_lossが最低で2.41くらいまで、policy_lossが最低で1.30まで落ちてこちらはもっと落ちそう。正直厳しい。
2021/09/22 2:02
convのreluをleakyreluに変更。alpha=0.01
1万局
https://scrapbox.io/files/614a1ace368e21002375184a.png
https://scrapbox.io/files/614a1ae2727afa001d417a1d.png
うーん、まだだめそう。。。
2021/09/22 11:24
学習データの前処理ミスってた。やっべ。
残差ブロック16個をとりあえずぶちこむ。
2500局で学習。
https://scrapbox.io/files/614aa06f0bab040022e1661e.png
https://scrapbox.io/files/614aa07f85cb8b001dcd0398.png
なんだかなあ、という感じ。
2021/09/22 13:36
policyのずれをグラフにしてみる。
https://scrapbox.io/files/614ab2c9e7c246001f156a96.png
横軸x: 学習データで1位の手が推論だとx位
縦軸: 度数
2021/09/22 13:37
policyの答えについて、序盤の局面だとone-hotにしない方が良い気がしたので実装。crossentropyが無駄にbreakとかしてなければone-hotじゃなくてもいい感じになるはず。
学習も1000局でやった。
残差を4つにしたから前のと比べられないじゃん!!
https://scrapbox.io/files/614ab51f961890001dd471de.png
https://scrapbox.io/files/614ab52f14b232001d441a87.png
avg policy error 5.82974335472044
2021/09/22 13:48
とりあえずpolicy lossがone hotでないデータも入れると下がるのかを見てみる。まあ下がると思うけど。
2500局、残差16に戻した。11:24と同じ条件。
ただしvalue lossはミス修正後なので色々違うはず。
https://scrapbox.io/files/614ac11a2f97f000228e3b3f.png
https://scrapbox.io/files/614ac12e3373d00023d5294a.png
https://scrapbox.io/files/614ac13f78002f0020839b04.png
avg policy error 2.8219455252918286
結構良いのでは?!
val_value_lossが荒ぶってるのはまた考えることにする
2021/09/22 14:48
カーネルを64枚にして、カーネルサイズを3と4にしてそれぞれ残差なしで学習させたら4の方が性能が良かった。
2021/09/22 15:05
カーネル64枚、サイズ4で残差を2ブロック
2500局
https://scrapbox.io/files/614ac9677523d4001d7580ce.png
https://scrapbox.io/files/614ac97c7523d4001d758180.png
https://scrapbox.io/files/614ac99678002f00208401f2.png
avg policy error 2.696342412451362
val_value_mae=0.0679
モデル小さくしたのに普通に良かった。
2021/09/22 15:18
残差をconv-activate-addのみにした。最初のconvでの正規化もしないようにした。
これで残差2つで2500局。
https://scrapbox.io/files/614ad8a459643f001d782e0a.png
https://scrapbox.io/files/614ad8b67523d4001d765b9f.png
https://scrapbox.io/files/614ad8c4a0499a00222b68f5.png
avg policy error 2.4305058365758754
val_policy_loss: 1.9023 - val_value_loss: 0.0101 - val_policy_mae: 0.0233 - val_value_mae: 0.0719
かなり良いけど収束は高いので、もう少し残差増やす。
2021/09/22 16:19
残差ブロック4つで再学習。
2500局で100エポック。
https://scrapbox.io/files/614aedeae0d610002367add4.png
https://scrapbox.io/files/614aedf8f038a2001d9742f7.png
https://scrapbox.io/files/614aee0869a4bc002138bea8.png
avg policy error 1.8104280155642023
val_loss: 1.9879 - val_policy_loss: 1.6556 - val_value_loss: 0.0096 - val_policy_mae: 0.0207 - val_value_mae: 0.0692
めっちゃ性能良くて笑った。
2021/09/22 17:51
全てのconv後に正規化を入れた。
https://scrapbox.io/files/614b0e49a3e5b6001f8c2697.png
https://scrapbox.io/files/614b0e5bd92868001d9a76f8.png
https://scrapbox.io/files/614b0e6900c93f002149448b.png
avg policy error 3.625058365758755
val_loss: 3.2161 - val_policy_loss: 2.7062 - val_value_loss: 0.0170 - val_policy_mae: 0.0218 - val_value_mae: 0.1052
全く駄目
2021/09/22 20:08
convのactivateをtanhに変更
https://scrapbox.io/files/614b19f5a09ed200234bd016.png
https://scrapbox.io/files/614b1a054fa1b9001d5c1f51.png
https://scrapbox.io/files/614b1a14a5154c001d74d0cf.png
avg policy error 2.296342412451362
val_loss: 2.3975 - val_policy_loss: 1.8585 - val_value_loss: 0.0095 - val_policy_mae: 0.0217 - val_value_mae: 0.0683
びみょん。
2021/09/22 20:58
出力層以外の全部のactivateをLeakyReLU(0.01)にした
https://scrapbox.io/files/614b2b1dfb80b9001d7d0251.png
https://scrapbox.io/files/614b2b2bf038a2001d98f806.png
https://scrapbox.io/files/614b2b39e7d7e6001d876dd3.png
avg policy error 1.7934630350194551
val_loss: 1.9909 - val_policy_loss: 1.6713 - val_value_loss: 0.0100 - val_policy_mae: 0.0209 - val_value_mae: 0.0713
良き。
2021/09/22 22:10
上と同じ条件で10000局、400エポック学習。
保存し忘れに気づいた…3時間が溶けた…
2021/09/23 0:34
何となくleakyreluのalpha=0.01から0.1にする
一度2500局100エポック学習。
これはだめだった。
2021/09/23 2:52
基本的に20:58のパラメータを使用。
ついでなので追加入力の入力直後の全結合を16から64-32の2層に変更した。この追加入力を信頼しているので。
さらに空きマス情報を盤面入力に追加。
2500局、200エポック
使う棋譜をランダムに選ぶことにした
https://scrapbox.io/files/614ba2f9017704001d24f9a0.png
https://scrapbox.io/files/614ba30dfa60b40022389e85.png
https://scrapbox.io/files/614ba331e911df001d486400.png
val_loss: 2.1342 - val_policy_loss: 1.8291 - val_value_loss: 0.0064 - val_policy_mae: 0.0224 - val_value_mae: 0.0605
avg policy error 2.1347685048658214
policyの誤差分布を再計算
https://scrapbox.io/files/614ba6e1731ba9001daa2c68.png
https://scrapbox.io/files/614ba6f8e0d61000236ab13f.png
avg policy error 2.111085174810665
まあこんなもんでしょう。。もうちょい精度上がってほしさはあるけど。
2021/09/23 7:17
試しに蒸留してみる。
モデルは以下
code: model
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
__________________________________________________________________________________________________
conv2d (Conv2D) (None, 8, 8, 64) 3072 input_100 __________________________________________________________________________________________________
__________________________________________________________________________________________________
leaky_re_lu (LeakyReLU) (None, 8, 8, 64) 0 conv2d00 __________________________________________________________________________________________________
dense (Dense) (None, 32) 384 input_200 __________________________________________________________________________________________________
global_average_pooling2d (Globa (None, 64) 0 leaky_re_lu00 __________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, 32) 0 dense00 __________________________________________________________________________________________________
concatenate (Concatenate) (None, 96) 0 global_average_pooling2d00 __________________________________________________________________________________________________
dense_1 (Dense) (None, 64) 6208 concatenate00 __________________________________________________________________________________________________
dense_2 (Dense) (None, 1) 97 concatenate00 __________________________________________________________________________________________________
policy (Activation) (None, 64) 0 dense_100 __________________________________________________________________________________________________
value (Activation) (None, 1) 0 dense_200 ==================================================================================================
Total params: 9,761
Trainable params: 9,761
Non-trainable params: 0
__________________________________________________________________________________________________
2500局で学習
さすがにきつかった。policy_lossが3くらいで収束しそう。
2021/09/23 7:28
カーネル数を32に減らして残差を1つ入れた。
1000局で十分足りそうなので1000局を使う。
https://scrapbox.io/files/614bb1f3a14335001dbad519.png
https://scrapbox.io/files/614bb2022ee5b300213d0c97.png
https://scrapbox.io/files/614bb215812bfa0023cbd4b3.png
val_loss: 2.6398 - val_policy_loss: 2.4449 - val_value_loss: 1.7545e-04 - val_policy_mae: 0.0138 - val_value_mae: 0.0105
avg policy error 2.5157954545454544
悪くはない。
気づいたんだけど100エポックじゃ収束してないよな
2021/09/23 7:47
**モデル書き換わったので信用ならん!!**
カーネル16枚にして残差を2つにした。
500局で学習。とりあえず100エポック。
https://scrapbox.io/files/614bb4d37a05bf0023fcc722.png
https://scrapbox.io/files/614bb4e316666000229e9605.png
https://scrapbox.io/files/614bb4f67c6ea9001dfdab40.png
https://scrapbox.io/files/614bb50c16666000229e962c.png
val_loss: 2.7356 - val_policy_loss: 2.5934 - val_value_loss: 3.0869e-04 - val_policy_mae: 0.0154 - val_value_mae: 0.0147
avg policy error 3.2875831485587583
んー、微妙。
**モデル書き換わったので信用ならん!!**
2021/09/23 7:59
そもそもvalueの収束が早すぎるので、追加入力をなくしてみることにした。
そして残差を3つにした。
テストデータ確保のためにトータル600局、うち40%をテストに回すことにした。
これ、多分追加入力なくした影響で全然policyのlossが下がらなくなった。
2021/09/23 8:05
teacherモデルを小さいやつで書き換えてたのでteacherを再学習。
2500局、200エポック。
せっかくだしこれから寝るので学習に時間がかかっても良いので、残差を4から6に変更。
https://scrapbox.io/files/614be64768946e001fc39a93.png
https://scrapbox.io/files/614be64b4fa1b9001d5ea861.png
val_loss: 2.1077 - val_policy_loss: 1.7946 - val_value_loss: 0.0080 - val_policy_mae: 0.0217 - val_value_mae: 0.0652
avg policy error 2.0200995405819295
まあ良し。
https://scrapbox.io/files/614be6f5b3cccd001d52c60c.png
https://scrapbox.io/files/614be6ff34da0d001d2170b2.png
2021/09/23 11:31
このモデルでもう一度蒸留
残差ブロック2つ、追加入力から32Denseが1つのモデル。
800局、500エポック
https://scrapbox.io/files/614bead3b0692f0021b1ca4a.png
https://scrapbox.io/files/614beadfe7d7e6001d89b08a.png
val_loss: 2.7536 - val_policy_loss: 2.6026 - val_value_loss: 3.0841e-04 - val_policy_mae: 0.0162 - val_value_mae: 0.0146
avg policy error 3.6641760310643057
下は棋譜のデータによるグラフ
https://scrapbox.io/files/614beb1cd072e10022652587.png
https://scrapbox.io/files/614beb2845778a001dd6c5c6.png
精度が足りぬ。
2021/09/23 11:49
残差2から4ブロックに変更
https://scrapbox.io/files/614befb9a010050020fb169c.png
https://scrapbox.io/files/614befc3efc1ab001d081b0c.png
val_loss: 2.5733 - val_policy_loss: 2.4319 - val_value_loss: 2.1916e-04 - val_policy_mae: 0.0144 - val_value_mae: 0.0117
avg policy error 4.895878418256935
https://scrapbox.io/files/614bf0026297b40020212cff.png
https://scrapbox.io/files/614bf00d7361b700215cd2b9.png
精度が足りぬ
2021/09/23 12:11
追加入力後を32Denseだったのを32-16Denseにした。追加入力が大きな意味を持っていれば精度が上がるはず
https://scrapbox.io/files/614bfaece7d7e6001d89eb08.png
https://scrapbox.io/files/614bfafb68946e001fc41024.png
val_loss: 2.4788 - val_policy_loss: 2.3290 - val_value_loss: 3.2210e-04 - val_policy_mae: 0.0135 - val_value_mae: 0.0144
↓対大きなモデル
https://scrapbox.io/files/614bfb17b3cccd001d531a30.png
https://scrapbox.io/files/614bfb3a7361b700215d1258.png
avg policy error (2.39, 3.04, 3.54, 3.9, 4.36)
↓対棋譜
https://scrapbox.io/files/614bfbc1e0d61000236c2d92.png
https://scrapbox.io/files/614bfbcbefc1ab001d087fce.png
avg policy error (4.52, 32.41, 24.1, 22.78, 21.93)
まあ教師モデルに対して良く学習できてるからいっか。
2021/09/23 13:15
推論実装の都合でkernel_size=3としてみる(偶数だと無理!)
https://scrapbox.io/files/614c0d59f038a2001d9c339b.png
https://scrapbox.io/files/614c0d63c1b2d3002340304d.png
val_loss: 2.5766 - val_policy_loss: 2.4329 - val_value_loss: 4.8510e-04 - val_policy_mae: 0.0145 - val_value_mae: 0.0184
https://scrapbox.io/files/614c0d9da5154c001d789c38.png
https://scrapbox.io/files/614c0da8a5154c001d789c5d.png
avg policy error (2.85, 3.5, 3.94, 4.34, 4.71)
https://scrapbox.io/files/614c0dd89a0ae1001dd81d25.png
https://scrapbox.io/files/614c0de3e079670024f0f29f.png
avg policy error (5.02, 30.41, 21.44, 17.92, 17.84)
2021/09/23 21:43
追加入力から伸びるニューロンを、32-16から16-32に変更。
batchnormalizationを追加
残差=2、カーネル枚数=16に減らした。
800局500エポックで学習!
https://scrapbox.io/files/614c859f64751800214d88e4.png
https://scrapbox.io/files/614c85ac38c1c4001d101e7a.png
val_loss: 2.6047 - val_policy_loss: 2.6044 - val_value_loss: 2.6554e-04 - val_policy_mae: 0.0156 - val_value_mae: 0.0128
https://scrapbox.io/files/614c85bae1820c002356a164.png
https://scrapbox.io/files/614c85ca3dba280023b2f0df.png
avg policy error (3.59, 4.37, 4.8, 5.2, 5.59)
まあもう妥協か。。。
**色々あって同じ条件で再学習した**
val_loss: 2.6204 - val_policy_loss: 2.6200 - val_value_loss: 3.4135e-04 - val_policy_mae: 0.0159 - val_value_mae: 0.0146
avg policy error (3.7, 4.33, 4.89, 5.21, 5.59)
2021/09/23 23:55
推論を見るとbatchnormalizationあたりでなんかよくわからんことになっているので、なかったことにして再学習
てかないほうが性能良い。
val_loss: 2.5563 - val_policy_loss: 2.5560 - val_value_loss: 2.9107e-04 - val_policy_mae: 0.0155 - val_value_mae: 0.0135
2021/09/24 14:57
残差後に16ノード(カーネル数と一緒)のDenseとLeakyReLUをかけてみた。
800局を50%で分けて、1000エポック学習。
val_loss: 2.4989 - val_policy_loss: 2.4987 - val_value_loss: 2.4678e-04 - val_policy_mae: 0.0147 - val_value_mae: 0.0123
avg policy error (2.97, 3.77, 4.24, 4.74, 5.04)
https://scrapbox.io/files/614d703d579a1f001e2f19e8.pnghttps://scrapbox.io/files/614d704d028422001da86398.png
https://scrapbox.io/files/614d707ed6002f00235b88d8.pnghttps://scrapbox.io/files/614d70844729370023cb1b75.png
いいじゃん。
2021/09/25 3:45
新たに入手した棋譜で**小さな**モデルをとりあえず学習。
2500局、10エポック
https://scrapbox.io/files/614e20bbf8394d00230a9c19.pnghttps://scrapbox.io/files/614e20c1f40a230024af519a.png
https://scrapbox.io/files/614e210e34d50a001daf03ee.pnghttps://scrapbox.io/files/614e211e771efb00221e1949.png
policyは学習の気配があるがvalueがだめそう
2021/09/25 4:04
valueの出力前に16ノードのdenseを1つ噛ませた。
これ、もしかしたらpolicy_loss下げたほうがコスパ良いからってだけかもしれんな。
**2000**局1000エポック学習。
val_loss: 2.7073 - val_policy_loss: 2.6000 - val_value_loss: 0.1073 - val_policy_mae: 0.0265 - val_value_mae: 0.2536
avg policy error (4.85, 33.34, 25.58, 30.85, 29.03)
https://scrapbox.io/files/614e31f5492bd90023e0d81e.pnghttps://scrapbox.io/files/614e31ffbf452f001d5c1086.png
https://scrapbox.io/files/614e321a1216d0001dfa886b.pnghttps://scrapbox.io/files/614e322042c9a1001d2df5ea.png
valueが下がらないなあ
2021/09/25 10:07
4:04でdense1つ噛ませた後、activateしてなかった。LeakyReLUを入れた。ついでなのでconcatenate直後に64ノードのdenseを入れてさっきのはなしにした。こうすればpolicyのlossも下がりそうなので。
若干過学習の傾向を感じた?ので2500局に戻して1000エポック。
valueがmae=0.24くらいまでは学習してそうだがあまり進まないので切った
2021/09/25 10:24
全体的に色々denseを追加
2500局1000エポックだとvalueが過学習気味なので4500局1000エポックで。
mseに重みを30かけてvalueを下げろという気持ちを伝えた。
val_loss: 5.6666 - val_policy_loss: 2.8034 - val_value_loss: 2.8632 - val_policy_mae: 0.0277 - val_value_mae: 0.2348
avg policy error (6.24, 32.69, 25.47, 30.71, 24.76)
https://scrapbox.io/files/614eae04b74e83001f4a0523.pnghttps://scrapbox.io/files/614eae135dc0b6002376f6e8.png
https://scrapbox.io/files/614eaf5c5dc0b6002376fff1.pnghttps://scrapbox.io/files/614eaf64dc3b64001d4cd650.png
value完全に過学習だしpolicyの性能も悪くて泣いた。
蒸留を考える。
2021/09/25 22:29
value networkを最終石差で見ていたが、これを勝敗にした。
モデルを適度に小型化していざ学習。
valueのmseのweightを10倍に変更。
データ作成時、同じ盤面のデータを集約するのをやめた。
2500局1000エポック
https://scrapbox.io/files/614f29f225f898001d2ecd4a.pnghttps://scrapbox.io/files/614f29fd0841c5001d096959.png
val_loss見た感じ過学習なので重みをとっぱらってみる。
2021/09/25 22:55
val_lossをただのmseに戻した
val_loss: 3.1954 - val_policy_loss: 2.4610 - val_value_loss: 0.7345 - val_policy_mae: 0.0259 - val_value_mae: 0.7110
avg policy error (4.98, 33.98, 24.7, 23.51, 20.03)
https://scrapbox.io/files/614f49a3a31ee7002493a78e.pnghttps://scrapbox.io/files/614f49aadc3b64001d4febec.png
https://scrapbox.io/files/614f49b6dbf0f6002351a9a1.pnghttps://scrapbox.io/files/614f49bb398a2f00226ff244.png
過学習しているが結構良いのでとりあえずこれを使ってみる
わりと強くて笑った(私の2勝1敗)
2021/09/26 1:54
とりあえず上のはかなり小さいモデル(パラメータ7000個台)なので、残差を3つ、さらに追加入力の後にDense16を1つ追加。
過学習考慮でDropout入れようか迷ったがデータ数の暴力でなんとかすることにした
10000局、1000エポック。睡眠中に頑張れ。
val_loss: 2.8767 - val_policy_loss: 2.1830 - val_value_loss: 0.6937 - val_policy_mae: 0.0245 - val_value_mae: 0.7075
val_loss: 2.6868 - val_policy_loss: 1.9455 - val_value_loss: 0.7413
avg policy error (3.71,)
https://scrapbox.io/files/614fce4bd1727b001d0031c6.pnghttps://scrapbox.io/files/614fce52093c0e001d549a86.png
https://scrapbox.io/files/614fce5dc0f5d5001f510041.pnghttps://scrapbox.io/files/614fce642f5713001dce6911.png
良い!!!
2021/09/26 17:25
カーネル数を20までだけ増やした(32はパラメータ多すぎ)
メモリ周りの効率を良くして2万局で自分のパソコンで学習
中盤のみを学習データにした
val_loss: 2.8197 - val_policy_loss: 2.0618 - val_value_loss: 0.7579 - val_policy_mae: 0.0236 - val_value_mae: 0.7706
avg policy error (2.87,)
https://scrapbox.io/files/6151403464a89c002494ffa1.pnghttps://scrapbox.io/files/6151403de090dc0024625bf2.png
https://scrapbox.io/files/6151404dffd0400021bb17af.pnghttps://scrapbox.io/files/6151405cdc7955001d4a92bd.png
よき
2021/09/27 16:11
上のモデルは結構強かった。
self_playおよびdecideをアップデートして、自己対戦でさらに強くしようと模索している。
2021/09/27 22:32
畳み込みカーネル32枚で残差2層、入力は盤面だけ
2万局で1000エポック
パラメータ数はそんな変わらん
val_loss: 2.8936 - val_policy_loss: 2.1614 - val_value_loss: 0.7322
https://scrapbox.io/files/6152610f7890d80023b9eb9a.pnghttps://scrapbox.io/files/6152612d389a1d002224f333.png
https://scrapbox.io/files/6151404dffd0400021bb17af.pnghttps://scrapbox.io/files/6151405cdc7955001d4a92bd.png
これ、カーネルサイズをミスって2にしてた。
2021/09/28 10:01
カーネルサイズを3に戻して、カーネル枚数25で残差が2つ、追加入力を全結合8だけに簡略化したものを20000局で学習。
これ、できてない
2021/09/28 18:55
trineutronさんの評価関数を参考に追加入力を変更
追加入力に以下を追加
Xに打っている場合、隅が空いているか
Cに打っていて且つ隅が空いている場合、その辺のAとBの空きマス数
AWSのg4dn.4xlargeで20000局1000エポック学習
val_loss: 2.7717 - val_policy_loss: 2.0364 - val_value_loss: 0.7353
avg policy error (2.6,)
https://scrapbox.io/files/6153047d8443be001d12d911.pnghttps://scrapbox.io/files/61530483ce6bb500216e0649.png
https://scrapbox.io/files/615304914ab349001dba6b93.pnghttps://scrapbox.io/files/615304974ab349001dba6bc0.png
めっちゃ良い!!
2021/10/02 11:32
新たな棋譜というかbookで学習
自分のパソコンなので15万盤面しか使っていない
val_loss: 3.1155 - val_policy_loss: 2.5193 - val_value_loss: 0.5961
https://scrapbox.io/files/6157caab4e49ca001db93fd0.pnghttps://scrapbox.io/files/6157cab6900ee1001dc14d9b.png
2021/10/02 15:45
なんかvalueの収束が早くてすぐ過学習するので、もうdual networkじゃなくて良い気がしてきた。
盤面入力によるpolicyと独自値入力によるvalueで完全にモデルを分けてみた。
過学習しにくいので1000局で学習
avg policy error (4.18,)
https://scrapbox.io/files/615814f3a83677001df5f467.pnghttps://scrapbox.io/files/615814fb4e49ca001dba7717.png
https://scrapbox.io/files/6158163e0d89d9001e63074f.pnghttps://scrapbox.io/files/61581644192d4b001d61deb5.png
2021/10/02 17:54
モデルを少し大きくして再学習
1000局
avg policy error (4.65,)
https://scrapbox.io/files/61581e3d20d30600208a3c72.pnghttps://scrapbox.io/files/61581e51876153001df2b5f1.png
https://scrapbox.io/files/61581e75ec7cbc001da3e1c9.pnghttps://scrapbox.io/files/61581e7cd54afe001fdf2b99.png
だめ。
2021/10/02 18:37
追加入力だけだとvalueのlossが下がらないのは追加入力だめなんじゃと思って、
ボード入力のみ
残差ブロックを増やす
とした。
g4dn.xlargeで学習
avg policy error (2.35,)
https://scrapbox.io/files/615856f9d53724002227ecb5.pnghttps://scrapbox.io/files/6158570094c7a700245510e7.png
https://scrapbox.io/files/615858e9f30a68001d6ddac9.pnghttps://scrapbox.io/files/615858f2e9b1ed0023f80a0e.png
良い。若干valueが過学習気味だけど。
2021/10/03 12:21
wasm化したら残差ブロックが激遅なので蒸留
https://scrapbox.io/files/615921e9cd0131001d616ff1.pnghttps://scrapbox.io/files/615921fe2c7a24001d6b7c11.png
https://scrapbox.io/files/61592209353a79002333a964.pnghttps://scrapbox.io/files/61592215972fc4001deeb177.png
性能悪すぎて泣いてるけどとりあえず実験。
2021/10/04 11:29
昨日の夜にこどげ向けにとりあえず蒸留
val_loss: 2.2579 - val_policy_loss: 2.1953 - val_value_loss: 0.0626
avg policy error (3.24,)
https://scrapbox.io/files/615a6753560fa9001ddb61a4.pnghttps://scrapbox.io/files/615a675d9b47af0023356d19.png
https://scrapbox.io/files/615a676d01c852001dedbe89.pnghttps://scrapbox.io/files/615a6782fe7e3500223e4495.png
うーん、ちなみにこどげだと初代に勝てない…
2021/10/05 1:36
こどげは圧縮パワーでねじ伏せた。
セルフプレイについて,そこでの実際に計算した方策と価値を学習データにしてみた
方策についてはノード訪問回数を正規化したやつ(softmaxだとだめだった)
価値はノードの平均重み
2021/10/06 23:30
調べると,各合法手について,1つだけやたら探索してあとは1桁回しか探索していないことがしょっちゅうあった。これはpolicy出力でsoftmaxする特性によるもので,その直前のレイヤでleakyReLUを使ったのが極端な値の入力につながっていけなかったと思う。
2021/10/07 0:07
重みの最大値と最小値の振れ幅が小さくなったのでパラメータを増やしても十分な精度で圧縮できるようになった。ということでこれまでのモデルに残差ブロック1つ追加した。
他のオセロソフトで出した評価値と方策を使って4000局で学習
学習中のグラフは不手際でない。
36エポック
loss: 2.0420 - policy_loss: 1.7567 - value_loss: 0.2853 - val_loss: 2.3927 - val_policy_loss: 1.9807 - val_value_loss: 0.4120
avg policy error (2.11,)
https://scrapbox.io/files/615dbde72bad3e001f9289a3.pnghttps://scrapbox.io/files/615dbdedb6efbe0024a43326.png
良いね。
2021/10/07 17:06
序盤のbookをやはり導入したいのでモデルをコンパクトにするよう心がける。softmaxの直前はtanhで再学習
ついでなので畳み込みカーネル数を32から40枚に増やして残差ブロックを2から1に減らして実験。
loss: 2.4081 - policy_loss: 2.0883 - value_loss: 0.3198 - val_loss: 2.6316 - val_policy_loss: 2.2055 - val_value_loss: 0.4261
avg policy error (3.09,)
https://scrapbox.io/files/615eb086b14920001da2a69a.pnghttps://scrapbox.io/files/615eb08efff5a8001d731374.png
https://scrapbox.io/files/615eb09c65e86e001d86b529.pnghttps://scrapbox.io/files/615eb0a3b14920001da2a83d.png
まあまあ。
2021/10/07 17:48
残差ブロックを0にしてカーネルを64枚まで増やした
loss: 3.1778 - policy_loss: 2.8137 - value_loss: 0.3640 - val_loss: 3.2711 - val_policy_loss: 2.8425 - val_value_loss: 0.4285
avg policy error (6.58,)
https://scrapbox.io/files/615eb469f36a1e001f014022.pnghttps://scrapbox.io/files/615eb4708c8443001db9daf8.png
https://scrapbox.io/files/615eb48cfff5a8001d7336a4.pnghttps://scrapbox.io/files/615eb491a01a57001d2ed15d.png
カーネルもうちょい増やすか。
2021/10/07 17:50
カーネル128枚,GAP後のpolicy向けのDenseを1つなくした,つまりpolicyはGAP後すぐにDenseで64出力となる。
これに伴いconv後のActivationをLeakyReLUからtanhに変更
loss: 3.1923 - policy_loss: 2.8627 - value_loss: 0.3297 - val_loss: 3.3307 - val_policy_loss: 2.9125 - val_value_loss: 0.4182
だめ
https://scrapbox.io/files/615ec6200df115001d1eaf7e.pnghttps://scrapbox.io/files/615ec626a70d1f001d537ec3.png
2021/10/08 0:46
まず最初に勝った方のデータのみでpolicy,つまり畳み込みからpolicy出力までを学習して,その後に畳み込み後からvalueの出力までを学習してみたらどうか。
これ,冷静に考えてだめでしょ
2021/10/08 0:59
なんか新しく別の棋譜から作ったデータの教師のvalueがはちゃめちゃだったみたいなので元々使ってた棋譜で学習し直すことにした
value lossが別のデータセットだと1.6くらいだった。ランダム理論値でも1.0なのに。多分正負逆にして学習してた。
とりあえず1万局
loss: 2.5399 - policy_loss: 2.0056 - value_loss: 0.5343 - val_loss: 2.6286 - val_policy_loss: 2.0332 - val_value_loss: 0.5954
avg policy error (2.72,)
https://scrapbox.io/files/615f302e9fbade002364b1b5.pnghttps://scrapbox.io/files/615f3034544d7e001e4e914e.png
https://scrapbox.io/files/615f303f19f20c001d7ea61d.pnghttps://scrapbox.io/files/615f30435d48e7001de2cdff.png
2021/10/08 8:57
わけあって学習し直し
loss: 2.6281 - policy_loss: 2.0892 - value_loss: 0.5390 - val_loss: 2.6891 - val_policy_loss: 2.1067 - val_value_loss: 0.5825
https://scrapbox.io/files/615f89719dd8f8001d153874.pnghttps://scrapbox.io/files/615f8978a137ef001f4fd6de.png
2021/10/08 10:23
パラメータを減らしたい気持ちになったので,残差ブロック後のpolicy向けのDenseと,残差ブロック後のvalue向けDenseの1つをなくした
5000局
loss: 2.7372 - policy_loss: 2.1955 - value_loss: 0.5417 - val_loss: 2.8323 - val_policy_loss: 2.2279 - val_value_loss: 0.6043
avg policy error (3.29,)
https://scrapbox.io/files/615f9ed28dbd40001dbc6df1.pnghttps://scrapbox.io/files/615f9ed7a49150001dd987b7.png
https://scrapbox.io/files/615f9eede911490020a8ce06.pnghttps://scrapbox.io/files/615f9ef29cb9a900212e83c2.png
2021/10/08 11:18
上の,データ処理のミスでなんかvalueが変。データが先手必勝になってた
同じモデルでもう一回学習
valueだけが狂っていたので前回のモデルを読み込んで再学習
2021/10/08 22:49
なんかモデルが明らかに負け局面でも勝ちとか言うのがおかしいのでAWSで1万局使って学習
loss: 2.8435 - policy_loss: 2.1470 - value_loss: 0.6965 - val_loss: 2.9193 - val_policy_loss: 2.1897 - val_value_loss: 0.7296
avg policy error (3.15,)
https://scrapbox.io/files/616056fd6be2f2001d70f985.pnghttps://scrapbox.io/files/616057039b6e46001dc360af.png
https://scrapbox.io/files/6160577c3e9b00001f8b465a.pnghttps://scrapbox.io/files/61605783630e8d001d60d9db.png
まあまあ。これを使おう。
2021/10/09 20:20
なんか1万局じゃ足りないみたいなので4万局で学習
AWSで
loss: 2.7716 - policy_loss: 2.0313 - value_loss: 0.7403 - val_loss: 2.7979 - val_policy_loss: 2.0453 - val_value_loss: 0.7526
avg policy error (2.74,)
https://scrapbox.io/files/6161a71a57de0800212b1e3b.pnghttps://scrapbox.io/files/6161a720a5721000220cc6c8.png
https://scrapbox.io/files/6161a731e0a6f0001d661261.pnghttps://scrapbox.io/files/6161a73759795b00219bbbc2.png
いいね
2021/10/11 19:02
5000局の自己対戦で追加学習。
lr=0.0001
loss: 3.1931 - policy_loss: 2.5135 - value_loss: 0.6796 - val_loss: 3.2699 - val_policy_loss: 2.5690 - val_value_loss: 0.7009
https://scrapbox.io/files/61640bf6e16551001dd676f3.pnghttps://scrapbox.io/files/61640bfb6b2775002329efa9.png
なんか弱くなった…
2021/10/11 20:13
ランダム要素を20%の確率で使って手を打つことにして、そのときのデータは棋譜に含めないことにした。
1000局で学習。lr=0.0001で50エポックだけ。
loss: 2.4904 - policy_loss: 1.9106 - value_loss: 0.5797 - val_loss: 2.6494 - val_policy_loss: 1.9614 - val_value_loss: 0.6880
https://scrapbox.io/files/61641cdb19e5ed00227c3420.pnghttps://scrapbox.io/files/61641ce136f6a6001d02f993.png
2021/10/11 20:40
序盤4手(実質3手)ランダム打ちで開始にした。ランダム率は変わらず20%
1000局
loss: 2.9861 - policy_loss: 2.4226 - value_loss: 0.5635 - val_loss: 3.2147 - val_policy_loss: 2.4906 - val_value_loss: 0.7240
https://scrapbox.io/files/6164268878f636001dd6f482.pnghttps://scrapbox.io/files/6164268f8b29da002028fdf0.png
だめそう
2021/10/11 22:03
5000局使う。
なんか序盤ランダム打ちしたら自己対戦で有意に白が勝ちやすいんだがなんなんだろ。
Adamのlrは0.001に戻した。
https://scrapbox.io/files/61643d1540eeb3001dd50bcd.pnghttps://scrapbox.io/files/61643d1be16551001dd7a1be.png
b black win 46
n black win 46
b white win 48
n white win 49
一応newが勝ち越し。
ほとんど変わらんが…
これ、こどげ的には弱かった
2021/10/11 23:39
入力にコーナー4マスを4つ持ってきたのを使ってみる。
4マスをくっつけて16x16の画像にして3枚(黒白空)を入力。
これに35枚のカーネルでconvかけてGAP取ったやつを、もとの8x8入力に35枚のカーネルでconv+残差にGAP取ったやつに結合して、70ノードを作ってDense1つでpolicyとvalueを出す。
これ、だめ
2021/10/12 21:07
カーネル枚数を49枚まで増やして5000局で学習
loss: 2.7755 - policy_loss: 2.1077 - value_loss: 0.6678 - val_loss: 2.9429 - val_policy_loss: 2.1705 - val_value_loss: 0.7724
https://scrapbox.io/files/61657a9fa8073200235c52f3.pnghttps://scrapbox.io/files/61657aa557ed26001da96fea.png
性能はもちろん悪いが圧縮は無事成功。
2021/10/13 15:02
カーネルを50枚にしてAWSで65000局使って学習
loss: 2.6105 - policy_loss: 1.8757 - value_loss: 0.7348 - val_loss: 2.6359 - val_policy_loss: 1.8877 - val_value_loss: 0.7482
avg policy error (2.36,)
https://scrapbox.io/files/6166973fe5f792001dd2e712.pnghttps://scrapbox.io/files/616697452cbd51001d13cb27.png
https://scrapbox.io/files/61669751d41e84001dd0d66b.pnghttps://scrapbox.io/files/616697575b9e2d0023eaa8c6.png
良いね。
2021/10/14 2:22
rollout policyを64カーネルのconv直後にdenseで作った。
1000局で軽く学習
おそすぎてだめ
2021/10/14 4:18
角を簡単に取らせるのをやめたい&convでは辺の状態を見れないので、辺のみを抜き取ったconvを作ることにした。
てか1x8と8x1のconv入れてstridesを(1,7)と(7,1)にすれば良いんじゃない?
残差ブロックは実装がだるいのでないことにした。
これによりこのconvはpaddingをvalidにした。というかvalidじゃないと意味ないよね
つまり1カーネルあたり出力されるのは2ピクセルで、それをGAP取ることになる。
自分で学習フレームワーク作れたら転置してカーネルを使いまわしたりしそう。
ん?これって単に辺だけ抜き出してDenseすれば良いんじゃない?
でもkeras使った実装(重みの再利用)がよくわからん
とりあえず10000局
3x3カーネルは40枚、1x8、8x1はそれぞれ8枚にした。
loss: 2.7741 - policy_loss: 2.0819 - value_loss: 0.6922 - val_loss: 2.8424 - val_policy_loss: 2.1215 - val_value_loss: 0.7210
https://scrapbox.io/files/6167aca4373b23001db226af.pnghttps://scrapbox.io/files/6167acb19382a5001d27faf6.png
https://scrapbox.io/files/6167acc246bae0001dbee56f.pnghttps://scrapbox.io/files/6167acc838f86f00218169ed.png
まあ良い
2021/10/15 15:17
相手がA4とA6に置いた時に何故かA2に自分が置くのが解せぬ。
てことでモデルを学習しなおしてみる。
ついでなので残差ブロックを2つに増やしてカーネル数を30枚に減らした。パラメータ数はこれで若干増えた。
20000局で手元で学習
avg policy error (2.64,)
グラフ消しちゃったあああ
https://scrapbox.io/files/61694371107abf001d52565d.pnghttps://scrapbox.io/files/616943789a65bf0021953f60.png
テストデータ 2.7000463008880615, 2.0249552726745605, 0.6750913262367249
2021/10/15 18:48
余裕があるのでカーネル数を32枚まで増やした
20000局で手元
loss: 2.6814 - policy_loss: 1.9982 - value_loss: 0.6832 - val_loss: 2.7639 - val_policy_loss: 2.0306 - val_value_loss: 0.7333
https://scrapbox.io/files/61695434096067001da0eca0.pnghttps://scrapbox.io/files/61695440e49044001ddd9bc2.png
2021/10/15 23:46
残差ブロックを3つに変更
20000局
loss: 2.4216 - policy_loss: 1.7658 - value_loss: 0.6558 - val_loss: 2.5703 - val_policy_loss: 1.8586 - val_value_loss: 0.7117